﻿#define _CRT_SECURE_NO_WARNINGS 1

#include <iostream>
#include <vector>
using namespace std;
int main()
{
	std::vector<int> foo;  
	std::vector<int> bar;   
	foo.push_back(8); 
	foo.push_back(5);

	bar.push_back(7);
	bar.push_back(9);
	bar.push_back(1);
	bar.push_back(9);
	bar.push_back(9);
	bar.push_back(9);
	bar.push_back(9);

	if (foo == bar) std::cout << "foo == bar\n";
	if (foo != bar) std::cout << "foo != bar\n";
	if (foo < bar) std::cout << "foo < bar\n";
	if (foo > bar) std::cout << "foo > bar\n";
	return 0;
}

//class Solution
//{
//public:
//    bool IsName(int x, int y, vector<vector<int> >& v)
//    {
//        for (int i = x + 1; i < v.size(); i++)
//        {
//            vector<int>::iterator it = find(v[i].begin(), v[i].end(), v[x][y]);
//            if (it != v[i].end())
//            {
//                return true;
//            }
//        }
//        return false;
//    }
//    bool hostschedule(vector<vector<int> >& schedule)
//    {
//        vector<vector<int> > v(schedule.size());
//        for (int i = 0; i < schedule.size(); i++)
//        {
//            for (int j = schedule[i].front(); j < schedule[i].back(); j++)
//            {
//                v[i].push_back(j);
//            }
//        }
//
//        for (int i = 0; i < v.size(); i++)
//        {
//            for (int j = 0; j < v[i].size(); j++)
//            {
//                if (IsName(i, j, v))
//                {
//                    return false;
//                }
//            }
//        }
//        return true;
//    }
//};


//class Solution
//{
//public:
//    bool IsTimeSame(int x, int y, vector<vector<int> >& v)
//    {
//        int begin1 = v[x].front(), end1 = v[x].back();
//        int begin2 = v[y].front(), end2 = v[y].back();
//        for (int i = begin1; i < end1; i++)
//        {
//            for (int j = begin2; j < end2; j++)
//            {
//                if (i == j)
//                {
//                    return true;
//                }
//            }
//        }
//        return false;
//    }
//    bool hostschedule(vector<vector<int> >& schedule)
//    {
//        for (int i = 0; i < schedule.size(); i++)
//        {
//            for (int j = i + 1; j < schedule.size(); j++)
//            {
//                if (IsTimeSame(i, j, schedule))
//                {
//                    return false;
//                }
//            }
//        }
//        return true;
//    }
//};


//class Solution 
//{
//public:
//	bool hostschedule(vector<vector<int> >& schedule) 
//	{
//		sort(schedule.begin(), schedule.end());
//		for (int i = 0; i < schedule.size() - 1; i++) 
//		{
//			if (schedule[i][1] > schedule[i + 1][0]) 
//			{
//				return false;
//			}
//		}
//		return true;
//	}
//};


//#include <iostream>
//#include <string>
//#include <algorithm>
//using namespace std;
//
//bool IsNumber(int x)
//{
//    int i = 2;
//    while (i <= x)
//    {
//        if (x % i == 0)
//        {
//            break;
//        }
//        i++;
//    }
//    if (i == x)
//    {
//        return true;
//    }
//    return false;
//}
//int main()
//{
//    int maxn = 1, minn = 100, count = 1;
//    int n = 0;
//    string str;
//    char s;
//    cin >> str;
//    sort(str.begin(), str.end());
//    s = str[0];
//    for (int i = 1; i < str.size(); i++)
//    {
//        if (s == str[i])
//        {
//            count++;
//        }
//        else
//        {
//            maxn = max(count, maxn);
//            minn = min(count, minn);
//            count = 1;
//            s = str[i];
//        }
//    }
//    maxn = max(count, maxn);
//    minn = min(count, minn);
//    n = maxn - minn;
//    if (IsNumber(n))
//    {
//        cout << "Lucky Word" << endl;
//        cout << n << endl;
//    }
//    else
//    {
//        cout << "No Answer" << endl;
//        cout << 0 << endl;
//    }
//    return 0;
//}


//#include <iostream>
//#include <vector>
//#include <algorithm>
//using namespace std;
//
//int main()
//{
//    int n = 0;
//    int sum = 0, add = 0;
//    int x = 1;
//    vector<int> v;
//    cin >> n;
//    v.resize(n);
//    for (int i = 0; i < v.size(); i++)
//    {
//        cin >> v[i];
//        add += v[i];
//    }
//    sort(v.begin(), v.end());
//    if (add % 2 != 0)
//    {
//        cout << "false" << endl;
//    }
//    else
//    {
//        add /= 2;
//        for (int i = 0; i < v.size() - 1; i++)
//        {
//            sum = add - v[i];
//            vector<int>::iterator it = find(v.begin() + i + 1, v.end(), sum);
//            if (it != v.end())
//            {
//                x = 0;
//                cout << "true" << endl;
//                break;
//            }
//        }
//        if (!x)
//        {
//            cout << "false" << endl;
//        }
//    }
//    return 0;
//}




#include <iostream>
#include <vector>
using namespace std;

int main() {
    int n, t, sum = 0;
    cin >> n;
    vector<int> nums; nums.reserve(n);
    //由于背包容量要最后才知道，这道题没有办不保存原数组
    while (n-- && cin >> t) {
        nums.push_back(t);
        sum += t;
    }
    if (sum % 2) {
        cout << "false" << endl;//奇数，无解
        return 0;
    }
    sum /= 2;
    vector<bool> dp(sum + 1, false);
    int i, j, boundary, curMax = 0;
    dp[0] = true;
    //只是判断是否有解，不需要用二维数组来dp

    for (i = 0; i < nums.size(); ++i) {
        boundary = min(sum - nums[i], curMax);
        for (j = boundary; j >= 0; --j) {

            if (dp[j]) {
                dp[j + nums[i]] = true;
                curMax = max(j + nums[i], curMax);
                if (j + nums[i] == sum)break;
            }
        }

    }

    cout << (dp[sum] ? "true" : "false") << endl;

}

